{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分类训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "b'\\x00\\x00\\x00\\x02'"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import struct\n",
    "struct.pack('>i', 2)  # 把数字2 打包压缩成一个二进制的int串，占位4个字节；如果是B 是1个字节"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2051, 60000, 28, 28)\n",
      "47040000\n"
     ]
    }
   ],
   "source": [
    "with open('./train-images-idx3-ubyte','rb') as f:\n",
    "    buffer = f.read(4*4)  # 4个int，图片的每一个像素\n",
    "    head = struct.unpack('>iiii', buffer) # 解压成四个int\n",
    "    print(head)  #60000 张图片，每张图片的像素是28*28\n",
    "    \n",
    "    length = head[1] * head[2] * head[3]\n",
    "    print(length)  # length 代表读取的字节数\n",
    "    \n",
    "    buffer = f.read(length)\n",
    "    data = struct.unpack('>{}B'.format(length), buffer)  # B代表一个字节\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "47040000"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tuple"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "type(data)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "imgs = np.reshape(data, (head[1], head[2], head[3]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "imgs.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "# 规划成一个三维矩阵\n",
    "imgs = np.reshape(data, (head[1], head[2], head[3]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "imgs.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "for i in range(5):\n",
    "    plt.imshow(imgs[i])   #  cmap = 'gray'\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# MAT 二进制数据集\n",
    "import sklearn\n",
    "from sklearn.datasets import fetch_mldata\n",
    "mnist = fetch_mldata('mnist-original', data_home='./')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'DESCR': 'mldata.org dataset: mnist-original',\n",
       " 'COL_NAMES': ['label', 'data'],\n",
       " 'target': array([0., 0., 0., ..., 9., 9., 9.]),\n",
       " 'data': array([[0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        ...,\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0],\n",
       "        [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mnist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'0.19.2'"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sklearn.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "X,y = mnist['data'], mnist['target']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000, 784)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X.shape   # 28*28 = 784"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(70000,)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [],
   "source": [
    "some_digit = X[36000]  # 28000 4 38000 6   180000 2\n",
    "some_digit_image = some_digit.reshape(28,28)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(some_digit_image, cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "5.0"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y[36000]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 建立测试集和训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [],
   "source": [
    "# X_train 取前60000条记录，X_test 取后10000条记录\n",
    "X_train, X_test, y_train, y_test = X[:60000],X[60000:],y[:60000],y[60000:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([24058, 25568, 47821, ...,   367, 41814, 20788])"
      ]
     },
     "execution_count": 122,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将数据集合交叉洗牌，交叉验证时，每个子集合数据分布均匀，因为之前的数据可能连续一段数字都是5 都是2，打乱顺序\n",
    "import numpy as np\n",
    "shuffle_index = np.random.permutation(60000)  # 60000的下标\n",
    "shuffle_index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train,y_train = X_train[shuffle_index], y_train[shuffle_index]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       ...,\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0],\n",
       "       [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3., 4., 7., ..., 0., 6., 3.])"
      ]
     },
     "execution_count": 129,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练一个二元分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 识别数字5，二元分类5或者非5\n",
    "# 创建目标向量，等于5 返回True，不等于返回False\n",
    "y_train_5 = (y_train == 5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False, False, ..., False, False, False])"
      ]
     },
     "execution_count": 151,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False, False, False, ..., False, False, False],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [False, False, False, ..., False,  True, False],\n",
       "       ...,\n",
       "       [False, False,  True, ..., False,  True,  True],\n",
       "       [False, False, False, ..., False, False, False],\n",
       "       [False, False, False, ..., False, False, False]])"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_5.reshape(20,-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_5 = (y_test==5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False, False, ..., False, False, False])"
      ]
     },
     "execution_count": 154,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_test_5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True])"
      ]
     },
     "execution_count": 155,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# SGD 梯度下降分类器  适合大数据集\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "\n",
    "sgd_clf = SGDClassifier(random_state = 42) # 随机因子\n",
    "sgd_clf.fit(X_train, y_train_5)\n",
    "\n",
    "test_digit = X[36000]\n",
    "\n",
    "sgd_clf.predict([test_digit])  # 预测是否是5 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 性能考核"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用交叉验证测量精度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.95775, 0.96715, 0.9519 ])"
      ]
     },
     "execution_count": 157,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 节省测试集的资源，在训练集上进行交叉验证\n",
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "# 参数释义  sgd_clf 随机因子，X训练集，y二元分类TrueFalse\n",
    "cross_val_score(sgd_clf, X_train, y_train_5, cv=3, scoring='accuracy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 以上为精度列表，分别表示百分比，三个精度值，因为cv=3 表示三个折叠，训练集分成3份，两两成对测试，得到三个精度，比较高"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 自定义一个估算器，判读图片不是5\n",
    "from sklearn.base import BaseEstimator\n",
    "\n",
    "class Never5Classifier(BaseEstimator):\n",
    "    def fit(self, X, y=None):\n",
    "        pass\n",
    "    def predict(self,X):\n",
    "        # 初始化一个矩阵，数据都是0\n",
    "        return np.zeros((len(X), 1), dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 164,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False],\n",
       "       [False],\n",
       "       [False],\n",
       "       ...,\n",
       "       [False],\n",
       "       [False],\n",
       "       [False]])"
      ]
     },
     "execution_count": 164,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 无论是什么数据，都返回一个写死的固定数据，都是False\n",
    "np.zeros((len(X), 1), dtype=bool)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.9095 , 0.91065, 0.9088 ])"
      ]
     },
     "execution_count": 165,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用自定的分类器测试\n",
    "never_5_clf = Never5Classifier()\n",
    "\n",
    "# 第一个参数是分类器，第二个参数是训练集，第三个参数是\n",
    "# 得到单一维度的精度分数\n",
    "cross_val_score(never_5_clf, X_train, y_train_5, cv=3, scoring = 'accuracy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 得到一个90%以上的数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_predict\n",
    "\n",
    "y_train_pred = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 168,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False, False, False, ..., False, False, False])"
      ]
     },
     "execution_count": 168,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 169,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54284,   295],\n",
       "       [ 2169,  3252]], dtype=int64)"
      ]
     },
     "execution_count": 169,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import confusion_matrix\n",
    "\n",
    "confusion_matrix(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 171,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[54579,     0],\n",
       "       [    0,  5421]], dtype=int64)"
      ]
     },
     "execution_count": 171,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "confusion_matrix(y_train_5, y_train_5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 172,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 分类器的精度， 正类预测的准确率  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "$\n",
    "\\text{精度} = \\cfrac{TP}{TP + FP}\n",
    "$\n",
    "\n",
    "TP是真正类的数量，FP是假正类的数量\n",
    "\n",
    "\n",
    "\n",
    "$\n",
    "\\text{召回率TPR} = \\cfrac{TP}{TP + FN}\n",
    "$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 174,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9168311248942769"
      ]
     },
     "execution_count": 174,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 混淆矩阵是衡量分类器的，纵向精度  横向  召回率\n",
    "\n",
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "# 第一个参数是实际结果，第二个参数是预测结果，衡量分类的效果\n",
    "precision_score(y_train_5,y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5998893193137798"
      ]
     },
     "execution_count": 175,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 把精度和召回率综合到一个指标，F1分数   谐波平均值\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7252453166815344"
      ]
     },
     "execution_count": 177,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import f1_score\n",
    "f1_score(y_train_5, y_train_pred)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([154417.7745355])"
      ]
     },
     "execution_count": 179,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 返回决策值 decision_function   大于5返回true 小于5返回false\n",
    "y_scores = sgd_clf.decision_function([some_digit])\n",
    "y_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {},
   "outputs": [],
   "source": [
    "threshold = 0 # 阀值\n",
    "y_some_digit_pred = (y_scores > threshold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True])"
      ]
     },
     "execution_count": 181,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [],
   "source": [
    "threshold = 150000 # 阀值\n",
    "y_some_digit_pred = (y_scores > threshold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ True])"
      ]
     },
     "execution_count": 183,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 184,
   "metadata": {},
   "outputs": [],
   "source": [
    "threshold = 200000 # 阀值\n",
    "y_some_digit_pred = (y_scores > threshold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 185,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([False])"
      ]
     },
     "execution_count": 185,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_some_digit_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 186,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(60000,)"
      ]
     },
     "execution_count": 186,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores = cross_val_predict(sgd_clf, X_train, y_train_5, cv=3,\n",
    "                             method=\"decision_function\")\n",
    "y_scores.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 187,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import precision_recall_curve\n",
    "\n",
    "precisions, recalls, thresholds = precision_recall_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 188,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_precision_recall_vs_threshold(precisions, recalls, thresholds):\n",
    "    plt.plot(thresholds, precisions[:-1], \"b--\", label=\"Precision\", linewidth=2)\n",
    "    plt.plot(thresholds, recalls[:-1], \"g-\", label=\"Recall\", linewidth=2)\n",
    "    plt.xlabel(\"Threshold\", fontsize=16)\n",
    "    plt.legend(loc=\"upper left\", fontsize=16)\n",
    "    plt.ylim([0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "plot_precision_recall_vs_threshold(precisions, recalls, thresholds)\n",
    "plt.xlim([-700000, 700000])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 193,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train_pred_90 = (y_scores > 30000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 194,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9330985915492958"
      ]
     },
     "execution_count": 194,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "precision_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 195,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5377236672200701"
      ]
     },
     "execution_count": 195,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_90)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "def plot_precision_vs_recall(precisions, recalls):\n",
    "    plt.plot(recalls, precisions, \"b-\", linewidth=2)\n",
    "    plt.xlabel(\"召回\", fontsize=16)\n",
    "    plt.ylabel(\"精度\", fontsize=16)\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_precision_vs_recall(precisions, recalls)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 197,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import roc_curve\n",
    "\n",
    "fpr, tpr, thresholds = roc_curve(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 198,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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4a233mLgwIFORxIRcRVXTO9rG1536N69O8OGDSM7O1uFLyJSC1xR+prer78++ugjLrroIkpLS2nYsCFPPfUUTZs2dTqWiIgruaP01fn1jt/v54477qBv37588cUXbN682elIIiKup9KXsNu8eTNnnHEGt956K8OGDWPlypW0bt3a6VgiIq7nioV8umavfhk+fDgrV65k9uzZjB49WjvriYiEiStKXwv56r6SkhL8fj8JCQk89thjeL1eTjjhBKdjiYhEFE3vS6377rvv6NmzJ9deey0AJ510kgpfRMQB7ih9Te/XSdZaZs+eTbdu3di4cSMXXHCB05FERCKaO0pfnV/n5ObmMnLkSMaOHcvJJ59MdnY25557rtOxREQimjtK3+kA8hu7du1iwYIF3HHHHSxatIgWLVo4HUlEJOK5YiGfVn/XDYFAgJdffpkLLriA1q1b89NPP5Gamup0LBERCXHHSF+d77jt27dzzjnncOGFF/L6668DqPBFROoYd4z0NcHvqEWLFjFq1Cj27NnDI488wjnnnON0JBERqYArRvqb9xY6HSFi/eMf/2DQoEGkpaWxbNky/vjHP+p0i4hIHeWK0s9IjXc6QsTq0qUL48aNY/ny5XTs2NHpOCIicgiumN6P8brid5d644UXXmD9+vVMmjSJgQMH6ja4IiL1hDvaUrPJYVFQUMAVV1zB0KFDeeWVV/D5fE5HEhGRagh76RtjZhpjPjXGTD7I11OMMW8aYxYaY14yxsRU+pxq/Vq3atUqsrKymDlzJjfddBPvvfceUVGumCgSEYkYYS19Y8wfAK+1thfQxhjTtoLDRgAzrLWDgK3A4Mqft2Zzyq/t2bOHU089lb179/L2229z1113ER0d7XQsERGppnAP1foBL4QeLwROBX7Y/wBr7SP7fZgObD/wSYwxVwJXAsQ0O0532aslRUVFxMfHk5aWxpw5c+jduzdNmjRxOpaIiBymcE/vJwKbQ493A00PdqAxpheQZq397MCvWWsft9ZmWWuzQNP7teGjjz7ihBNO4JVXXgHgggsuUOGLiNRz4S79fKD8+rqkg72+MaYh8CBwWVWeVNP7Ncfv9zNt2jT69u1LTEyM9swXEXGRcJf+CoJT+gCZwLoDDwgt3HsRuMlau74qT6rOrxmbNm1iwIAB3HbbbQwfPpyVK1eSlZXldCwREakh4S79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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "def plot_roc_curve(fpr, tpr, label=None):\n",
    "    plt.plot(fpr, tpr, linewidth=2, label=label)\n",
    "    plt.plot([0, 1], [0, 1], 'k--')\n",
    "    plt.axis([0, 1, 0, 1])\n",
    "    plt.xlabel('假正类率', fontsize=16)\n",
    "    plt.ylabel('真正类率', fontsize=16)\n",
    "\n",
    "plt.figure(figsize=(8, 6))\n",
    "plot_roc_curve(fpr, tpr)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 199,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9653070494401278"
      ]
     },
     "execution_count": 199,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算曲线下面积AUC，虚线是随机分类0.5到1\n",
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "roc_auc_score(y_train_5, y_scores)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 200,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\ensemble\\weight_boosting.py:29: DeprecationWarning: numpy.core.umath_tests is an internal NumPy module and should not be imported. It will be removed in a future NumPy release.\n",
      "  from numpy.core.umath_tests import inner1d\n"
     ]
    }
   ],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier\n",
    "forest_clf = RandomForestClassifier(n_estimators=10, random_state=42)\n",
    "y_probas_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3,\n",
    "                                    method=\"predict_proba\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 201,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1. , 0. ],\n",
       "       [1. , 0. ],\n",
       "       [1. , 0. ],\n",
       "       ...,\n",
       "       [1. , 0. ],\n",
       "       [0.9, 0.1],\n",
       "       [1. , 0. ]])"
      ]
     },
     "execution_count": 201,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_probas_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 202,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 绘制ROC曲线，需要决策值不是概率，直接使用正类的概率作为决策值：\n",
    "y_scores_forest = y_probas_forest[:, 1] \n",
    "fpr_forest, tpr_forest, thresholds_forest = roc_curve(y_train_5,y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0. , 0. , 0. , ..., 0. , 0.1, 0. ])"
      ]
     },
     "execution_count": 203,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_scores_forest"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 6))\n",
    "plt.plot(fpr, tpr, \"b:\", linewidth=2, label=\"SGD\")\n",
    "plot_roc_curve(fpr_forest, tpr_forest, \"Random Forest\")\n",
    "plt.legend(loc=\"lower right\", fontsize=16)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 205,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9930738385415199"
      ]
     },
     "execution_count": 205,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "roc_auc_score(y_train_5, y_scores_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9853561127135567"
      ]
     },
     "execution_count": 206,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 再看一下 精度和召回率 也很高\n",
    "y_train_pred_forest = cross_val_predict(forest_clf, X_train, y_train_5, cv=3)\n",
    "precision_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 207,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8192215458402509"
      ]
     },
     "execution_count": 207,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "recall_score(y_train_5, y_train_pred_forest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  多类别分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 208,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([5.])"
      ]
     },
     "execution_count": 208,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sgd_clf.fit(X_train, y_train)\n",
    "sgd_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 209,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-173587.85998794, -443190.2065313 , -431912.93286542,\n",
       "         -88742.01644013, -326176.31651924,  154417.7745355 ,\n",
       "        -621252.40445971, -170355.61724193, -627697.66054739,\n",
       "        -699128.36449516]])"
      ]
     },
     "execution_count": 209,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "some_digit_scores = sgd_clf.decision_function([some_digit])\n",
    "some_digit_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 210,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5.])"
      ]
     },
     "execution_count": 210,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用随机森林\n",
    "forest_clf.fit(X_train, y_train)\n",
    "forest_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 211,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0. , 0. , 0. , 0.2, 0. , 0.8, 0. , 0. , 0. , 0. ]])"
      ]
     },
     "execution_count": 211,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "forest_clf.predict_proba([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 评估分类器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 212,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.84043191, 0.87569378, 0.87373106])"
      ]
     },
     "execution_count": 212,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cross_val_score(sgd_clf, X_train, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 213,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([0.90746851, 0.91109555, 0.91053658])"
      ]
     },
     "execution_count": 213,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将输入进行简单缩放 ，可以得到准确率 90 %以上\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train.astype(np.float64))\n",
    "cross_val_score(sgd_clf, X_train_scaled, y_train, cv=3, scoring=\"accuracy\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 错误分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 214,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n",
      "c:\\users\\wanru\\appdata\\local\\programs\\python\\python37\\lib\\site-packages\\sklearn\\linear_model\\stochastic_gradient.py:128: FutureWarning: max_iter and tol parameters have been added in <class 'sklearn.linear_model.stochastic_gradient.SGDClassifier'> in 0.19. If both are left unset, they default to max_iter=5 and tol=None. If tol is not None, max_iter defaults to max_iter=1000. From 0.21, default max_iter will be 1000, and default tol will be 1e-3.\n",
      "  \"and default tol will be 1e-3.\" % type(self), FutureWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[5748,    2,   18,   11,    9,   43,   41,    7,   41,    3],\n",
       "       [   2, 6480,   50,   22,    5,   40,    9,   14,  110,   10],\n",
       "       [  62,   35, 5344,   94,   81,   28,  100,   54,  147,   13],\n",
       "       [  59,   37,  137, 5329,    2,  237,   37,   57,  140,   96],\n",
       "       [  25,   27,   37,   10, 5357,   11,   51,   35,   91,  198],\n",
       "       [  69,   48,   36,  185,   78, 4595,  108,   26,  180,   96],\n",
       "       [  40,   23,   51,    2,   44,   86, 5627,    5,   40,    0],\n",
       "       [  24,   20,   70,   30,   46,   11,    7, 5809,   15,  233],\n",
       "       [  59,  157,   71,  155,   13,  157,   56,   30, 5028,  125],\n",
       "       [  51,   34,   21,   94,  151,   37,    1,  217,   78, 5265]],\n",
       "      dtype=int64)"
      ]
     },
     "execution_count": 214,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred = cross_val_predict(sgd_clf, X_train_scaled, y_train, cv=3)\n",
    "conf_mx = confusion_matrix(y_train, y_train_pred)\n",
    "conf_mx"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 215,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 使用matplotlib的matshow 函数来查看混淆矩阵的图像表示\n",
    "plt.matshow(conf_mx, cmap = plt.cm.gray)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 216,
   "metadata": {},
   "outputs": [],
   "source": [
    "row_sums = conf_mx.sum(axis=1, keepdims=True)\n",
    "norm_conf_mx = conf_mx / row_sums"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 217,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 用0填充对角线 只保留错误，重新绘制\n",
    "np.fill_diagonal(norm_conf_mx, 0)\n",
    "plt.matshow(norm_conf_mx, cmap=plt.cm.gray)\n",
    "plt.show()\n",
    "# 最亮的点，3和5 混淆"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 218,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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noxUODk5mXycX758Ga1btwYApKamkjD4mDFjTHpeS5KSkkIz8PPnz1MoWJajGEJOTg527NiB9957DwAo0gMoSzcTJ07EkCFDACizL1NEAgrj6dOnGDp0KMLDwwEAPXv2xA8//AAAtA5pBHSOZ6PXOTo4ONDvcXFxuHnzZol3jtu3byenWL16dQoftG3bFj4+PhphYWMjL0yZQKKOvAlNmjRJI5lJGxnKsgSffvopADznGNXp3bs3HB0d0bVrVwDA66+/bjJ7goKCdH6WEi8vL1pzkn+r/8soTJkyBQBw8eJFugnt2bPH7A9f6ty+fZsSRF555RV069bNYrboS3x8PDZu3AgA6N+/P1xdXZGXlwdAydM4fvw4AEXdHlDW+wAl4a50aeU2ffPmTQobys/BEP755x/06dOH/i5dujQGDhwIAFiyZMlziYCWYNOmTQgPD6fEyG+//daYTrFAOKzKMAzDMNoIIQr60ZuMjAzRvn170b59e6FSqcSwYcOKcxizcefOHfHGG28IR0dH4ejoKK5du2YxW9q2bStUKpXOnz/++MNidmkTExMjYmJixCuvvCKghOqESqUS7u7uYtmyZWLZsmXi4MGDFrNP2gRABAUF0esHDhww2ile0J8icenSJVG1alVRtWpVoVKp6Du1NNevXxcuLi7CxcVFqFQq4eHhITw8PISzs7OoVq0a/VStWlX4+/sLf39/sWPHDpGcnEw/lmLUqFF0TX788cdi7969onPnzqJz584a12thP/L/bwzCwsLyHSuW5Pz586Jly5aiZcuWwsbGRgAQUVFRIioqylSn1DleTNIh5/Tp0wCA5s2bo06dOmjTpg05Yu3QYGBgIAAlu8icyP/36NGjsXr1aiqBsFS2JwDcuXMHhw8fBgB8+OGHVLsFKOFqmSnbqlUrqtUyNydOnECPHj0AKKFUmTa/fPly9O/f32glLoagfo0FBQU9t51LOQpm/Pjx+Oabb+hvU60PF4eoqCgAQN++ffNdZtB1n5F8//33tJRhDmTruj59+lAYddmyZYiMjHwuvwFQMrkrVKhA46pJkyYUUjx06BCmT58OAOjYsWOxbZIh27feegvJycmYPXs2AGDixIk4deoUAGXpw1zhS20GDhxIIWgA8PPzo0z3/PIuDISzVRmGYRimKJhk5ihrGTt16kQFuIDuJzpZv7J//364uLgU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\n",
      "text/plain": [
       "<Figure size 576x576 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_digits(instances, images_per_row=10, **options):\n",
    "    size = 28\n",
    "    images_per_row = min(len(instances), images_per_row)\n",
    "    images = [instance.reshape(size,size) for instance in instances]\n",
    "    n_rows = (len(instances) - 1) // images_per_row + 1\n",
    "    row_images = []\n",
    "    n_empty = n_rows * images_per_row - len(instances)\n",
    "    images.append(np.zeros((size, size * n_empty)))\n",
    "    for row in range(n_rows):\n",
    "        rimages = images[row * images_per_row : (row + 1) * images_per_row]\n",
    "        row_images.append(np.concatenate(rimages, axis=1))\n",
    "    image = np.concatenate(row_images, axis=0)\n",
    "    plt.imshow(image, cmap = matplotlib.cm.binary, **options)\n",
    "    plt.axis(\"off\")\n",
    "\n",
    "\n",
    "# 查看数字3和数字5的例子\n",
    "cl_a, cl_b = 3, 5\n",
    "X_aa = X_train[(y_train == cl_a) & (y_train_pred == cl_a)]\n",
    "X_ab = X_train[(y_train == cl_a) & (y_train_pred == cl_b)]\n",
    "X_ba = X_train[(y_train == cl_b) & (y_train_pred == cl_a)]\n",
    "X_bb = X_train[(y_train == cl_b) & (y_train_pred == cl_b)]\n",
    "\n",
    "plt.figure(figsize=(8,8))\n",
    "plt.subplot(221); \n",
    "plot_digits(X_aa[:25], images_per_row=5)\n",
    "plt.subplot(222); \n",
    "plot_digits(X_ab[:25], images_per_row=5)\n",
    "plt.subplot(223);\n",
    "plot_digits(X_ba[:25], images_per_row=5)\n",
    "plt.subplot(224); \n",
    "plot_digits(X_bb[:25], images_per_row=5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 多标签分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 219,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',\n",
       "           metric_params=None, n_jobs=1, n_neighbors=5, p=2,\n",
       "           weights='uniform')"
      ]
     },
     "execution_count": 219,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "y_train_large = (y_train >= 7)\n",
    "y_train_odd = (y_train % 2 == 1)  # 找到离得最近的那个点 \n",
    "y_multilabel = np.c_[y_train_large, y_train_odd]\n",
    "\n",
    "knn_clf = KNeighborsClassifier()\n",
    "knn_clf.fit(X_train, y_multilabel)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 220,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[False,  True]])"
      ]
     },
     "execution_count": 220,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "knn_clf.predict([some_digit])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 多输出分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 221,
   "metadata": {},
   "outputs": [],
   "source": [
    "noise = np.random.randint(0, 100, (len(X_train), 784))\n",
    "X_train_mod = X_train + noise\n",
    "noise = np.random.randint(0, 100, (len(X_test), 784))\n",
    "X_test_mod = X_test + noise\n",
    "y_train_mod = X_train\n",
    "y_test_mod = X_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 222,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAW4AAAC2CAYAAAD5uGd5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAZ1UlEQVR4nO3de4yV1bkG8Od1GJwBhA7IjOAoF8EChZkCIwUFpGlrovaPFpvYak9M2krTpG2aNGkPxaQ51GPak5SexARTEk9j7E1bL7FpTcCoxYIioyBIkSKXkfv9NgOOzMx7/mCmMns9C/beM3vPrM3zS4zs13fP/r5vLxfffGu9a5m7Q0RE0nFVXx+AiIjkRh23iEhi1HGLiCRGHbeISGLUcYuIJEYdt4hIYtRxi4gkZkC+bzSzxwFMAfBXd384lnfttdf6mDFjusU+/PBDmltWVhbEOjo6ss6NaWtrC2IVFRU0t6WlJYhdffXVNHfAgPDyffTRRzT3/PnzQeyqq8K/N1kM4Ocbm4Pf3t6eVQwABg0alHUuOzYzo7ksHrs2LDf2czN/xoEDB3Dy5EmenIds2zVwoW2PHTu2tz5apJvdu3fj6NGjtG3n1XGb2UIAZe4+x8z+z8wmuvt2ljtmzBisXbu2W2z7dpqKYcOGBbEzZ87Q3E984hNZH+/Ro0eD2OTJk2nuunXrgtiECRNoblVVVRD74IMPaO6hQ4eCGOs0Bw8eTN9/zTXXBLFYR8iu2alTp2hufX19EDt79izNraysDGLsL69YvKmpieayvxhjP3fv3r3dXj/wwAM0Lx+5tGsAGDt2LBobG3vt80Uu1tDQEP1v+T4qWQDg6c4/rwQw9+L/aGaLzKzRzBqPHDmS50eIFN0CXKJdA2rb0j/k23EPBrCv88/HAdRc/B/dfYW7N7h7w8iRI3tyfCLFdMl2DahtS/+Q7zPuZgBdvzcPwSX+Ajh37hw2b97cLVZbW0tzjx8/HsTKy8tpbi7Pouvq6oLYzp07ae7cucFNFg4cOEBzT58+HcT27dtHMvkjicxf+4H44w/2WePGjaO5o0aNCmKHDx+muVu3bg1iM2fOpLmrV68OYjfccAPNZeMYsXNjj0XY4y0gPOfYd56nrNu1SF/Kt2G+hY9/jawHsLtXjkakb6ldSxLyveN+HsBrZjYawJ0AZvfeIYn0GbVrSUJed9zufhoXBnLeAPBZd+dTFkQSonYtqch7Hre7n8DHI/AiJUHtWlKgwRcRkcTkfcedrfLy8mAWSaxIhRW67Nixg+aeOHEiiLGCGAC4/vrrg1hzczPNzSwWAnjVYyx+++2301w2y4IV28TOYeDAgUHs7bffprmtra1B7MYbb6S5o0ePDmKx+cmsipUV5QD8fKdPn05zWZUkmxkDhMVbse9GpJTpjltEJDHquEVEEqOOW0QkMeq4RUQSU/DByfb29qBcu6YmWAICALBhw4YgNmPGDJrLBvHeffddmssGImOl0ixeXV1Nc9kA6VtvvUVzp0yZEsTYKnyxJVUPHjwYxNhytbH47t27ae6QIUOCGCuvB4BPf/rTQSxWSs8GSNesWUNz2XXIXAq4y4gRI7q9jq0iKFLKdMctIpIYddwiIolRxy0ikhh13CIiiVHHLSKSmKKUvGfuFBIr62al8GymCcA3PIhtnss2C4jNFGEzHNiMDoDPfIiV88dK7DPFNgtms03mz59Pc7dt2xbEYhs8MNdddx2N79mzJ4iNHz+e5u7fvz+IxWbyDB06NOvczL1Gc9k0WqRU6I5bRCQx6rhFRBKjjltEJDHquEVEEpPz4KSZDQCws/MfAPieu2+O5Xd0dATlz2fOnKG5U6dODWJvvvlm7DiyOl6A74YeGyxkO82zdcIBXtbNYgCwZcuWIMbWpx40aBB9PxucZMcK8PONLTNQXl4exNju8wAwbdq0ILZr1y6ay77j2DVnywGwAWUAqKio6PY6tkRAPnJt2yJ9JZ9ZJXUA/uDuP+7tgxHpY2rbkoR8HpXMBvBFM3vTzB7vvEsRKQVq25KEfDru9QA+7+6zAJQDuKt3D0mkz6htSxLyuaPY5O5dD3IbAUzMTDCzRQAWAXy/R5F+Kqe2HdvHU6TQ8rnjftLM6s2sDMCXALyTmeDuK9y9wd0bMtdPFunHcmrbmRXBIsWSzx33UgC/B2AAXnD3ly6VXF5eHpRQx2YXbNy4MYixxfsB4NSpU0Hs2LFjNJdtLMBmMgB81/LMMusubNMEtnM7wHctZzNINm3aRN/PSuFjmwiw8vbM2RhdWBn7rFmzaO6BAweCWGw5APZ5dXV1Wf/c2C7vmZ0lmxXTAzm1bZG+knPH7e7v4sLou0hJUduWVKgAR0QkMeq4RUQSo45bRCQxBS8wOH36NFatWtUtVltbS3NvuummIBZbu3v16tVBLDaDhQ2UnT9/nuYePXo0q/cDfOA0tkP6kSNHghg73+HDh9P3f/jhh0GspaWF5rKlA/71r3/RXLbLO9u9HuADr7HrOG/evCC2eTOvHmdl67FS9szzYNdFpDc8++yzNL5w4cIgFluiYfLkyb16TF10xy0ikhh13CIiiVHHLSKSGHXcIiKJUcctIpKYgs8qKSsrwzXXXNMtxmYyAHxjgNiu6bNnzw5ibHdzgO8iHps5cfPNNwexdevW0dxbb701iP3yl7+kuczy5cuDGCv/BoBDhw4Fsa997Ws091vf+lYQi12bGTNmBLE1a9bQXLar/bBhw2gu24xhzpw5NPe9994LYrGZR88880y31wMHDqR50vt+9atf0XisbWV67rnnaHzSpElBLDYb4+9//3vWn+/uQSy2AUtPc6urq2kumyUWy2XnFqM7bhGRxKjjFhFJjDpuEZHEqOMWEUlMUfbUKysr6/Y6tisOW2M7tus5G7QcO3YszWVl82yAAeADBB0dHTT35ZdfDmJPPPEEzWXrfG/fvj2IxQZE2Dk89dRTNJet3R0bxHvjjTeCWGz9cTZA+v7779PcW265JYj99Kc/pblsoDg2kLlhw4Zur8+dO0fzpGdYufcPf/hDmsvabC6Dfa+99loQ+8c//kFzc/m5TG/kzp8/P4gtW7aM5l577bVZxXKlO24RkcSo4xYRSYw6bhGRxKjjFhFJjDpuEZHEZDWrxMxqAPzZ3ed1vn4cwBQAf3X3hy/13srKyqB8NTZizGY+sE0BAGDt2rVBLLb4fmNjYxCrqamhuWwDAPZZAC9Zz9zRvgubvfHggw8GsdgsDbZhANvIAeBl8/fddx/NZbu8x655LM6wUvjY8gXjxo0LYrFrnrlxQ+w7z1ZP2nYpY+XpsZlYzMyZM3v0+bGSdzYjg5XM5/pz2f/3/dll77jNrArAEwAGd75eCKDM3ecAGG9mEwt7iCKFobYtqcrmUUk7gHsBdO3JtQDA051/Xglgbu8flkhRqG1Lki7bcbv7aXe/uDJmMIB9nX8+DiB45mBmi8ys0cwa2R6OIv1BT9s220dUpBjyGZxsBtBVBjiE/Qx3X+HuDe7e0BtVQiJFklPbHjlyZFEPTqRLPiXvb+HCr5BvAKgHcMnFeNva2oKd00eNGkVzm5ubg1hmiXOXz3zmM0GMDbQBfN3skydP0ly2NvSECRNoLiuJZWX7APDII48Esblzw9/EP/WpT9H3s7L7nTt30ty6urogtmnTJprLBnYmTuSPdtkO9rHzZTvCx5YkyFyvHQCmT59OczPPecCAXl21Iae2XQpivzWwCQSxEvCHHnooiC1durRnByaXlE+rfx7Aa2Y2GsCdAMIdDUTSpLYtScj6UYm7L+j892lcGMR5A8BnM54RiiRHbVtSk9fvme5+Ah+PvouUDLVtSYEqJ0VEEqOOW0QkMQXfSOH8+fM4ePBgt9jZs2dp7oIFC4LYO++8Q3NZ+S2b9QDwkXO2YzkA/POf/wxiP/rRj2jurl27glhswwI2Is+mk23cuJG+n22OcNNNN9HcM2fOBLHW1laaW15eHsQyv68ubDOHXDZdYOcA8PL4t99+m+ZmHm9skwsJbd26NYgtXLiQ5jY1NQWx2NTe2267LavPipWbS+50xy0ikhh13CIiiVHHLSKSGHXcIiKJKfjgpLsHayizQUgAeOWVV4JYbL1ltoZzS0sLzR09enRWnwUAv/jFL4LY3r17aS4rm4+V8//ud78LYqtXrw5ijz76KH3/9ddfH8Rig7FsIJSVoMfiscHj2FrjDBs0jO3Izr63adOm0dzMEns2uHqli5Wx33XXXUGMDUICvA3FFoxjP/fGG28MYuvXr6fv13pGudMdt4hIYtRxi4gkRh23iEhi1HGLiCSm4IOTFRUVwRrTsY1gKysrg9isWbNo7r59+4JYbB1ptlEvWwMaiG/Wy7BqxFjVYVlZWRBjVZb3338/fT+r3oytbz1o0KAgFlu3evjw4UEsNrjF4rHBLVbVGRtIZIO/bEAZCDdNVuVkKLYpM/uuctkAOJfc3bt3B7Hq6mqa++qrrwax+fPnZ/1ZVyLdcYuIJEYdt4hIYtRxi4gkRh23iEhi1HGLiCQmq1klZlYD4M/uPs/MBgDY2fkPAHzP3TdHP2DAgGDmQqz0eciQIUEstos4K7+OrTnNysWfeuopmltRURHEYmtOz5gxI4jdc889NJet/71///4g9v3vf5++/7e//W0Q+8pXvkJz2TrfQ4cOpbls3eTYTvNsZgpbSxvg1zE2A6S2tjaIZTvrJ7bGd7Z60rZTE9ulnWHtePHixVm/ny3n8POf/5zmPvDAA0HsxRdfpLmTJk3K+hhK2WU7bjOrAvAEgK5FLeoA/MHdf1zIAxMpNLVtSVU2tyvtAO4F0LWi0WwAXzSzN83s8c67FJEUqW1Lki7bcbv7aXe/+HnFegCfd/dZAMoBBEuDmdkiM2s0s8ZYMYdIX1PbllTl84Bwk7sf6PxzI4CgXNHdV7h7g7s3sOetIv2U2rYkIZ9fBZ80s/8G8C6ALwF45FLJbW1tOH78eLdYbOCJyWUz2i1bttDcmTNnBrEpU6bQXDaoElvLmm3sG1tbmA3iZa5TDgCHDx+m72fXIVaev3z58iAWG9Rhg5OZZeVdWNl+LJd9P6y8HuAbQseueeagdE8HJzPk1Lb7K9begfja9oXABu5/8IMf0FxWCh/7/5O1qyvxL9B8Ou6lAH4PwAC84O4v9e4hifQZtW1JQtYdt7sv6Pz3u7gw+i5SEtS2JTUqwBERSYw6bhGRxKjjFhFJTFF2ef/oo4+6xUaMGEFzWfzll1+muZ/85CeDGNtZGuAL+LMd2gG+uzgbyQb4yHlskwi2CD2bXZM5A6fLM888E8TYjvQA8N3vfjeI/e1vf6O5bKbH9u3baW5dXfj4t62tjeay82AbPADAvHnzgtjKlStp7rhx47q97uVZJdIHWHn73XffTXPZjvKx8vhS3j1erV5EJDHquEVEEqOOW0QkMeq4RUQSU/DBSTMLdjMfP348zWUDkZMnT6a5rNQ6NlDFBsrYDusAsG7duiDG1gkH+PrUsYFXtuv5mjVrsvqZAB9oue+++2jud77znSDGBjcB4HOf+1wQu+GGG2guG8jct28fzZ06dWoQi11H9v2w6wUAx44d6/Y6Njgq6WAl+kuXLqW53/72t4MYW6seiJfYlwLdcYuIJEYdt4hIYtRxi4gkRh23iEhi1HGLiCSm4LNK2trakLnFU+bMgC5spsfp06dJJt9YILaRwpw5c4LYjh07aO7YsWODGNslHgCam5uDGCuvB4DXX389iLGS96amJvp+ttv9Cy+8QHOnT58exGLbbGUuRwDEv5/KysogFtvwgF2Hbdu20dwTJ04Esdji+FVVVd1eq+S9NL333ns0znaqj7WrUqZWLyKSGHXcIiKJUcctIpIYddwiIom57OCkmQ0D8EcAZQBaANwL4DEAUwD81d0fvtT729vbg8Gnm2++meaywb7Y4GRHR0cQiw1o7d+/P4jFdpHOpYT66NGjQaylpYXmspJ1VkIeW4eaDUTu2rWL5mYO4AHA0KFDaW5tbW0Qiw0M1dTUZH0MO3fuDGJs4BfgA82xQdrMY2CDVdnoabuW3G3dupXGlyxZEsSef/55msvWdL/jjjt6dmAJyuaO+34Ay9z9DgAHAXwVQJm7zwEw3swmFvIARQpE7VqSddk7bndfftHLkQC+DuB/O1+vBDAXAN8yRaSfUruWlGX9jNvM5gCoArAHQNeScMcBBL8/m9kiM2s0s8bYFmEi/UEu7boz/99tOzY3XqTQsuq4zWw4gEcBfANAM4CuSowh7Ge4+wp3b3D3Bvb8UqQ/yLVdA93bdmxMRaTQLttxm9lAAH8CsNjdmwC8hQu/RgJAPYDdBTs6kQJRu5aUZVPy/k0AMwAsMbMlAH4D4D/MbDSAOwHMvtSbOzo6cPbs2W6xWIkqWzy/urqa5rKZInv27KG5bPf3WLk4O4aKigqayzYciO3Szo53xYoVQWzz5s30/Rs2bAhisd9m2EYKixYtormZ3w0A1NfX09xVq1YFsdhGF+xuNPZoob29PYhNmDCB5maW0veg5L1H7bo/e/hhPiHmoYceKsjnsdkijzzySBCLzRRhM7Fis4V+8pOfBLEvf/nLlzvEkpPN4ORjuDBN6t/M7AUAXwDwP+4eLqIh0s+pXUvK8lpkyt1PAHi6l49FpE+pXUsqVDkpIpIYddwiIokp+HrcQ4YMwdy5c7vF1q5dS3P37t0bxIYNG0Zz2S7vZWVlNPfw4cNB7IMPPqC5f/nLX4JYbM1pVh7f2NhIc7dvD2s5br/99iAWW8+bDQLGSn0nTgyL/l599VWaO2nSpCAWK3lng7yxHeHZYGxs+YLRo0cHsdgg7XXXXdftdWtrK827krH/jwDgnnvuCWJsKQaADw7++te/zjrX3bPKA3gZ+5NPPklzr8SBSEZ33CIiiVHHLSKSGHXcIiKJUcctIpIYddwiIokp+KyS1tZWvP/++91ibAMBADhw4EAQW79+Pc295ZZb6GcxbAH/W2+9lea+9NJLQezZZ5+luePHjw9isRJsNtMj258JAIsXLw5irFwd4GX7bDd3gG8GwXafj/3c2MYPbMZL7NoMHDgwiMVmE2WW+cdmEl3JHnzwQRq/++67gxibcQXwGSCxWSHZbmbBZrUAwM9+9rMgxmY7ycd0xy0ikhh13CIiiVHHLSKSGHXcIiKJKfjgZFlZWTAYuWXLFprLSl9ju4ysW7cuiMUGtFgZ+ZgxY2jusmXLgtjBgwdpLivhjg0YsrJutvN6bB3qQ4cOBTF2vQCgubk5iMVK8dn1PXfuHM1dvXp1EGMDiwCwZs2aIDZixAiaO2XKlCAWuw6Zg5Oxz7+SzZw5k8ZZO2ZrwueKLccwb968Hv9cidMdt4hIYtRxi4gkRh23iEhi1HGLiCTmsoOTZjYMwB8BlAFoAXAvgPcB7OxM+Z6788WTRfoptWtJWTazSu4HsMzdV5nZYwD+E8Af3P3H2XzAVVddhcrKyiDGsI0JBgzgh3jbbbcFsVh5PJvhEJuNMHt2uLk324Uc4OXWrGwfAHbt2hXE2PmyPACora0NYrEd5WtqaoLY/PnzaW5TU1MQi83+YLNoYqXJO3bsCGJscwUAOHbsWBBraGiguZkbUrANNbLUo3ZdKhYtWtTXhyB5uOyjEndf7u6rOl+OBNAG4Itm9qaZPW5mBZ9SKNLb1K4lZVk/4zazOQCqAKwC8Hl3nwWgHMBdJHeRmTWaWSO7mxLpL3Jp1535/27bR44cKeKRinwsq47bzIYDeBTANwBscveu5wGNAIJl79x9hbs3uHtD7Ndukb6Wa7sGurftWHGYSKFdtuM2s4EA/gRgsbs3AXjSzOrNrAzAlwC8U+BjFOl1ateSsmye430TwAwAS8xsCYBXADwJwAC84O7hAtYXaW1tDQbcpk+fTnNPnjwZxFj5NgC0tLQEsY6ODprL7oyyXUMYiA+mbty4MYixNatjx8BK8dlu8EBY6g0A1dXVNJft6D516lSay8rb2UAoAGzbti2IsXJngH9vse+HLVXASvyB8Jrl8j1m6FG7FulLl+243f0xAI9lhP+rMIcjUhxq15IyFeCIiCRGHbeISGLUcYuIJEYdt4hIYgpeHTZo0CDU1dV1i50/f57mspL12C7eFRUVQSw2a4GVWrOSeQBYtWpVEGML/QO8VJttjgAA48aNC2Ls3GLz3tnO62wWDgBUVVUFsVh5/LRp04JYbOdvdmyvvPIKzWXnW19fT3NPnToVxGJtZNSoUd1eX3311TRPpJTpjltEJDHquEVEEqOOW0QkMeq4RUQSY+5e2A8wOwKga9HnawEcLegH9o1SPS+g/5/bGHfvk9We1LaTlsJ5Rdt2wTvubh9m1ujufIX8hJXqeQGlfW69qVSvk86rf9KjEhGRxKjjFhFJTLE77hVF/rxiKdXzAkr73HpTqV4nnVc/VNRn3CIi0nN6VCIikhh13CIiiSlax21mj5vZ62b2ULE+s5DMrMbMXrvodfLnZ2bDzOxFM1tpZs+Z2cBSOK9CKsXro7bd/xWl4zazhQDK3H0OgPFmRnfQToWZVQF4AsDgztelcn73A1jm7ncAOAjgqyiN8yqIEvre/01tOw3FuuNeAODpzj+vBDC3SJ9bKO0A7gVwuvP1ApTA+bn7cnfvWtd2JICvowTOq4AWoPSuj9p2AorVcQ8GsK/zz8cB1BTpcwvC3U+7+8WLSJfU+ZnZHABVAPaghM6rAErqewfUtlNRrI67GUBl55+HFPFzi6Vkzs/MhgN4FMA3UELnVSBXwvUpmXMspbZdrIN9Cx//KlIPYHeRPrdYSuL8zGwggD8BWOzuTSiR8yqgK+H6lMQ5llrbLvjWZZ2eB/CamY0GcCeA2UX63GIplfP7JoAZAJaY2RIAvwHwHyVwXoVSKt/7pZTKOZZU2y5a5WTnaPUXAKx294NF+dAiKtXzK9Xz6i1XwvUp1XNM+bxU8i4ikpikHsiLiIg6bhGR5KjjFhFJjDpuEZHEqOMWEUnM/wOCJYaYVOprNQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "some_index = 5500\n",
    "plt.subplot(121);plt.imshow(X_test_mod[some_index].reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.subplot(122);plt.imshow(y_test_mod[some_index].reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 223,
   "metadata": {},
   "outputs": [],
   "source": [
    "knn_clf.fit(X_train_mod, y_train_mod)\n",
    "clean_digit = knn_clf.predict([X_test_mod[some_index]])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 224,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(clean_digit.reshape(28, 28), cmap = matplotlib.cm.binary)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 垃圾邮件分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "SPAM_PATH = os.path.join('datasets','spam')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# HAM 表示正常邮件\n",
    "HAM_DIR = os.path.join(SPAM_PATH, 'easy_ham')\n",
    "SPAM_DIR = os.path.join(SPAM_PATH, 'spam')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 获得文件名，列表生成式；  文件名一般是等长的 大于等于20，如果太短会认为是非法邮件\n",
    "# 正常邮件名\n",
    "ham_filenames = [name for name in sorted(os.listdir(HAM_DIR)) if len(name) > 20]\n",
    "# 垃圾邮件名\n",
    "spam_filenames = [name for name in sorted(os.listdir(SPAM_DIR)) if len(name) > 20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用email模块解析邮件\n",
    "import email\n",
    "import email.policy\n",
    "\n",
    "# 一次解析一封邮件\n",
    "def load_email(is_spam, filename, spam_path = SPAM_PATH):\n",
    "    # 判读是否是垃圾邮件，读取不同的路径\n",
    "    directory = \"spam\" if is_spam else \"easy_ham\"    \n",
    "    with open(os.path.join(spam_path, directory, filename),'rb') as f:\n",
    "        # 返回email对象\n",
    "        return email.parser.BytesParser(policy=email.policy.default).parse(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Martin A posted:\n",
      "Tassos Papadopoulos, the Greek sculptor behind the plan, judged that the\n",
      " limestone of Mount Kerdylio, 70 miles east of Salonika and not far from the\n",
      " Mount Athos monastic community, was ideal for the patriotic sculpture. \n",
      " \n",
      " As well as Alexander's granite features, 240 ft high and 170 ft wide, a\n",
      " museum, a restored amphitheatre and car park for admiring crowds are\n",
      "planned\n",
      "---------------------\n",
      "So is this mountain limestone or granite?\n",
      "If it's limestone, it'll weather pretty fast.\n",
      "\n",
      "------------------------ Yahoo! Groups Sponsor ---------------------~-->\n",
      "4 DVDs Free +s&p Join Now\n",
      "http://us.click.yahoo.com/pt6YBB/NXiEAA/mG3HAA/7gSolB/TM\n",
      "---------------------------------------------------------------------~->\n",
      "\n",
      "To unsubscribe from this group, send an email to:\n",
      "forteana-unsubscribe@egroups.com\n",
      "\n",
      " \n",
      "\n",
      "Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/\n"
     ]
    }
   ],
   "source": [
    "# 让我们看一个ham示例\n",
    "ham_emails = [load_email(is_spam=False, filename=ename) for ename in ham_filenames]\n",
    "print(ham_emails[1].get_content().strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "A POWERHOUSE GIFTING PROGRAM You Don't Want To Miss! \n",
      " \n",
      "  GET IN WITH THE FOUNDERS! \n",
      "The MAJOR PLAYERS are on This ONE\n",
      "For ONCE be where the PlayerS are\n",
      "This is YOUR Private Invitation\n",
      "\n",
      "EXPERTS ARE CALLING THIS THE FASTEST WAY \n",
      "TO HUGE CASH FLOW EVER CONCEIVED\n",
      "Leverage $1,000 into $50,000 Over and Over Again\n",
      "\n",
      "THE QUESTION HERE IS:\n",
      "YOU EITHER WANT TO BE WEALTHY \n",
      "OR YOU DON'T!!!\n",
      "WHICH ONE ARE YOU?\n",
      "I am tossing you a financial lifeline and for your sake I \n",
      "Hope you GRAB onto it and hold on tight For the Ride of youR life!\n",
      "\n",
      "Testimonials\n",
      "\n",
      "Hear what average people are doing their first few days:\n",
      "�We've received 8,000 in 1 day and we are doing that over and over again!' Q.S. in AL\n",
      " �I'm a single mother in FL and I've received 12,000 in the last 4 days.� D. S. in FL\n",
      "�I was not sure about this when I sent off my $1,000 pledge, but I got back $2,000 the very next day!� L.L. in KY\n",
      "�I didn't have the money, so I found myself a partner to work this with. We have received $4,000 over the last 2 days. \n",
      "I think I made the right decision; don't you?� K. C. in FL\n",
      "�I pick up $3,000 my first day and I  they gave me free leads and all the training, you can too!� J.W. in CA\n",
      "\n",
      "ANNOUNCING: We will CLOSE your sales for YOU! And Help you get a Fax Blast IMMEDIATELY Upon Your Entry!!!    YOU Make the MONEY!!!\n",
      "FREE LEADS!!! TRAINING!!!\n",
      "\n",
      "$$DON'T WAIT!!! CALL NOW $$\n",
      "FAX BACK TO: 1-800-421-6318 OR Call 1-800-896-6568 \n",
      "\n",
      "Name__________________________________Phone___________________________________________\n",
      "\n",
      "Fax_____________________________________Email____________________________________________\n",
      "\n",
      "Best Time To Call_________________________Time Zone________________________________________\n",
      "\n",
      "This message is sent in compliance of the new e-mail bill. \"Per Section 301, Paragraph (a)(2)(C) of S. 1618, further transmissions by the sender of this email may be stopped, at no cost to you, by sending a reply to this email address with the word \"REMOVE\" in the subject line. Errors, omissions, and exceptions excluded.\n",
      " \n",
      "This is NOT spam! I have compiled this list from our Replicate Database, relative to Seattle Marketing Group, The Gigt, or Turbo Team for the sole purpose of these communications. Your continued inclusion is ONLY by your gracious permission. If you wish to not receive this mail from me, please send an email to tesrewinter@yahoo.com with \"Remove\" in the subject and you will be deleted immediately.\n"
     ]
    }
   ],
   "source": [
    "# 让我们看一个 spam 示例\n",
    "spam_emails = [load_email(is_spam=True, filename=ename) for ename in spam_filenames]\n",
    "print(spam_emails[5].get_content().strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# payload 获取邮件结构\n",
    "def get_email_structure(email):\n",
    "    if isinstance(email, str):\n",
    "        return email\n",
    "    payload = email.get_payload()\n",
    "    if isinstance(payload, list):\n",
    "        return \"multipart({})\".format(\", \".join([\n",
    "            get_email_structure(sub_email)\n",
    "            for sub_email in payload\n",
    "        ]))\n",
    "    else:\n",
    "        # 如果是纯文本邮件，直接返回\n",
    "        return email.get_content_type()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Counter({1: 1, 4: 2, 2: 3, 3: 2})"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from collections import Counter\n",
    "# 统计数组中每个数字出现了几次\n",
    "\n",
    "a = [1,4,2,3,2,3,4,2]  \n",
    " \n",
    "b = Counter(a) #求数组中每个数字出现了几次\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import Counter\n",
    "\n",
    "def structures_counter(emails):\n",
    "    structures = Counter()\n",
    "    for email in emails:\n",
    "        structure = get_email_structure(email)\n",
    "        structures[structure] += 1\n",
    "    return structures"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('text/plain', 2408),\n",
       " ('multipart(text/plain, application/pgp-signature)', 66),\n",
       " ('multipart(text/plain, text/html)', 8),\n",
       " ('multipart(text/plain, text/plain)', 4),\n",
       " ('multipart(text/plain)', 3),\n",
       " ('multipart(text/plain, application/octet-stream)', 2),\n",
       " ('multipart(text/plain, text/enriched)', 1),\n",
       " ('multipart(text/plain, application/ms-tnef, text/plain)', 1),\n",
       " ('multipart(multipart(text/plain, text/plain, text/plain), application/pgp-signature)',\n",
       "  1),\n",
       " ('multipart(text/plain, video/mng)', 1),\n",
       " ('multipart(text/plain, multipart(text/plain))', 1),\n",
       " ('multipart(text/plain, application/x-pkcs7-signature)', 1),\n",
       " ('multipart(text/plain, multipart(text/plain, text/plain), text/rfc822-headers)',\n",
       "  1),\n",
       " ('multipart(text/plain, multipart(text/plain, text/plain), multipart(multipart(text/plain, application/x-pkcs7-signature)))',\n",
       "  1),\n",
       " ('multipart(text/plain, application/x-java-applet)', 1)]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看正常邮件的结构\n",
    "structures_counter(ham_emails).most_common()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('text/plain', 218),\n",
       " ('text/html', 183),\n",
       " ('multipart(text/plain, text/html)', 45),\n",
       " ('multipart(text/html)', 20),\n",
       " ('multipart(text/plain)', 19),\n",
       " ('multipart(multipart(text/html))', 5),\n",
       " ('multipart(text/plain, image/jpeg)', 3),\n",
       " ('multipart(text/html, application/octet-stream)', 2),\n",
       " ('multipart(text/plain, application/octet-stream)', 1),\n",
       " ('multipart(text/html, text/plain)', 1),\n",
       " ('multipart(multipart(text/html), application/octet-stream, image/jpeg)', 1),\n",
       " ('multipart(multipart(text/plain, text/html), image/gif)', 1),\n",
       " ('multipart/alternative', 1)]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看垃圾邮件的结果\n",
    "structures_counter(spam_emails).most_common()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 正常邮件更多的是纯文本，而垃圾邮件有相当多的HTML。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Return-Path : <12a1mailbot1@web.de>\n",
      "Delivered-To : zzzz@localhost.spamassassin.taint.org\n",
      "Received : from localhost (localhost [127.0.0.1])\tby phobos.labs.spamassassin.taint.org (Postfix) with ESMTP id 136B943C32\tfor <zzzz@localhost>; Thu, 22 Aug 2002 08:17:21 -0400 (EDT)\n",
      "Received : from mail.webnote.net [193.120.211.219]\tby localhost with POP3 (fetchmail-5.9.0)\tfor zzzz@localhost (single-drop); Thu, 22 Aug 2002 13:17:21 +0100 (IST)\n",
      "Received : from dd_it7 ([210.97.77.167])\tby webnote.net (8.9.3/8.9.3) with ESMTP id NAA04623\tfor <zzzz@spamassassin.taint.org>; Thu, 22 Aug 2002 13:09:41 +0100\n",
      "From : 12a1mailbot1@web.de\n",
      "Received : from r-smtp.korea.com - 203.122.2.197 by dd_it7  with Microsoft SMTPSVC(5.5.1775.675.6);\t Sat, 24 Aug 2002 09:42:10 +0900\n",
      "To : dcek1a1@netsgo.com\n",
      "Subject : Life Insurance - Why Pay More?\n",
      "Date : Wed, 21 Aug 2002 20:31:57 -1600\n",
      "MIME-Version : 1.0\n",
      "Message-ID : <0103c1042001882DD_IT7@dd_it7>\n",
      "Content-Type : text/html; charset=\"iso-8859-1\"\n",
      "Content-Transfer-Encoding : quoted-printable\n"
     ]
    }
   ],
   "source": [
    "# 查看邮件头\n",
    "for header, value in spam_emails[0].items():\n",
    "    print(header,\":\",value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Life Insurance - Why Pay More?'"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "spam_emails[0][\"Subject\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 首先需要一个函数来将html转换为纯文本，使用[Beautifulsoup]库，下面的函数首先删除<head>部分，然后将所有<a>标记转换为单词hyperlink，然后去掉所有html标记，只留下纯文本。为了可读性，它还用一个换行符替换多个换行符，最后它取消了HTML实体（例如&gt；或&nbsp；）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 拆分训练集和测试集合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X = np.array(ham_emails + spam_emails)\n",
    "y = np.array([0] * len(ham_emails) + [1] * len(spam_emails))\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "import re\n",
    "from html import unescape\n",
    "\n",
    "def html_to_plain_text(html):\n",
    "    text = re.sub('<head.*?>.*?</head>', '', html, flags=re.M | re.S | re.I)\n",
    "    text = re.sub('<a\\s.*?>', ' HYPERLINK ', text, flags=re.M | re.S | re.I)\n",
    "    text = re.sub('<.*?>', '', text, flags=re.M | re.S)\n",
    "    text = re.sub(r'(\\s*\\n)+', '\\n', text, flags=re.M | re.S)\n",
    "    return unescape(text)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<HTML><HEAD><TITLE></TITLE><META http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1252\"><STYLE>A:link {TEX-DECORATION: none}A:active {TEXT-DECORATION: none}A:visited {TEXT-DECORATION: none}A:hover {COLOR: #0033ff; TEXT-DECORATION: underline}</STYLE><META content=\"MSHTML 6.00.2713.1100\" name=\"GENERATOR\"></HEAD>\n",
      "<BODY text=\"#000000\" vLink=\"#0033ff\" link=\"#0033ff\" bgColor=\"#CCCC99\"><TABLE borderColor=\"#660000\" cellSpacing=\"0\" cellPadding=\"0\" border=\"0\" width=\"100%\"><TR><TD bgColor=\"#CCCC99\" valign=\"top\" colspan=\"2\" height=\"27\">\n",
      "<font size=\"6\" face=\"Arial, Helvetica, sans-serif\" color=\"#660000\">\n",
      "<b>OTC</b></font></TD></TR><TR><TD height=\"2\" bgcolor=\"#6a694f\">\n",
      "<font size=\"5\" face=\"Times New Roman, Times, serif\" color=\"#FFFFFF\">\n",
      "<b>&nbsp;Newsletter</b></font></TD><TD height=\"2\" bgcolor=\"#6a694f\"><div align=\"right\"><font color=\"#FFFFFF\">\n",
      "<b>Discover Tomorrow's Winners&nbsp;</b></font></div></TD></TR><TR><TD height=\"25\" colspan=\"2\" bgcolor=\"#CCCC99\"><table width=\"100%\" border=\"0\"  ...\n"
     ]
    }
   ],
   "source": [
    "# 取训练集中所有的垃圾邮件，如果是html格式，则添加到 html_spam_emails 列表中\n",
    "html_spam_emails = [email for email in X_train[y_train==1]\n",
    "                    if get_email_structure(email) == \"text/html\"]\n",
    "\n",
    "# 取第8个元素，看看效果\n",
    "sample_html_spam = html_spam_emails[7]\n",
    "print(sample_html_spam.get_content().strip()[:1000], \"...\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "OTC\n",
      " Newsletter\n",
      "Discover Tomorrow's Winners \n",
      "For Immediate Release\n",
      "Cal-Bay (Stock Symbol: CBYI)\n",
      "Watch for analyst \"Strong Buy Recommendations\" and several advisory newsletters picking CBYI.  CBYI has filed to be traded on the OTCBB, share prices historically INCREASE when companies get listed on this larger trading exchange. CBYI is trading around 25 cents and should skyrocket to $2.66 - $3.25 a share in the near future.\n",
      "Put CBYI on your watch list, acquire a position TODAY.\n",
      "REASONS TO INVEST IN CBYI\n",
      "A profitable company and is on track to beat ALL earnings estimates!\n",
      "One of the FASTEST growing distributors in environmental & safety equipment instruments.\n",
      "Excellent management team, several EXCLUSIVE contracts.  IMPRESSIVE client list including the U.S. Air Force, Anheuser-Busch, Chevron Refining and Mitsubishi Heavy Industries, GE-Energy & Environmental Research.\n",
      "RAPIDLY GROWING INDUSTRY\n",
      "Industry revenues exceed $900 million, estimates indicate that there could be as much as $25 billi ...\n"
     ]
    }
   ],
   "source": [
    "# 查看转换成纯文本的效果\n",
    "print(html_to_plain_text(sample_html_spam.get_content())[:1000], \"...\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 编写一个函数，它以电子邮件为输入，并以纯文本形式返回其内容，无论其格式是什么\n",
    "def email_to_text(email):\n",
    "    html = None\n",
    "    for part in email.walk():\n",
    "        ctype = part.get_content_type()\n",
    "        if not ctype in (\"text/plain\", \"text/html\"):\n",
    "            continue\n",
    "        try:\n",
    "            content = part.get_content()\n",
    "        except: # 解决编码问题\n",
    "            content = str(part.get_payload())\n",
    "        if ctype == \"text/plain\":\n",
    "            return content\n",
    "        else:\n",
    "            html = content\n",
    "    if html:\n",
    "        return html_to_plain_text(html)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "OTC\n",
      " Newsletter\n",
      "Discover Tomorrow's Winners \n",
      "For Immediate Release\n",
      "Cal-Bay (Stock Symbol: CBYI)\n",
      "Wat ...\n"
     ]
    }
   ],
   "source": [
    "print(email_to_text(sample_html_spam)[:100], \"...\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 将所有处理整合到一个转换器中，我们将使用它将电子邮件转换为文字计数器。注意，我们使用python的'split（）'方法将句子拆分为单词，该方法使用空格作为单词边界。但例如，汉语和日语脚本通常不在单词之间使用空格在这个练习中没关系，因为数据集（主要）是英文的，中文可以使用结巴分词来进行拆分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Computations => comput\n",
      "Computation => comput\n",
      "Computing => comput\n",
      "Computed => comput\n",
      "Compute => comput\n",
      "Compulsive => compuls\n"
     ]
    }
   ],
   "source": [
    "# 装自然语言工具包（[nltk]（http://www.nltk.org/）\n",
    "# pip install nltk\n",
    "\n",
    "# 用“url”替换url的方法 \n",
    "# pip install urlextract\n",
    "import nltk\n",
    "from urlextract import URLExtract\n",
    "\n",
    "try:\n",
    "    import nltk\n",
    "\n",
    "    stemmer = nltk.PorterStemmer()\n",
    "    for word in (\"Computations\", \"Computation\", \"Computing\", \"Computed\", \"Compute\", \"Compulsive\"):\n",
    "        print(word, \"=>\", stemmer.stem(word))\n",
    "except ImportError:\n",
    "    print(\"Error: stemming requires the NLTK module.\")\n",
    "    stemmer = None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.base import BaseEstimator, TransformerMixin\n",
    "\n",
    "class EmailToWordCounterTransformer(BaseEstimator, TransformerMixin):\n",
    "    def __init__(self, strip_headers=True, lower_case=True, remove_punctuation=True,\n",
    "                 replace_urls=True, replace_numbers=True,  stemming=True):\n",
    "        self.strip_headers = strip_headers\n",
    "        self.lower_case = lower_case\n",
    "        self.remove_punctuation = remove_punctuation\n",
    "        self.replace_urls = replace_urls\n",
    "        self.replace_numbers = replace_numbers\n",
    "        self.stemming = stemming\n",
    "    def fit(self, X, y=None):\n",
    "        return self\n",
    "    def transform(self, X, y=None):\n",
    "        X_transformed = []\n",
    "        for email in X:\n",
    "            text = email_to_text(email) or \"\"\n",
    "            if self.lower_case:\n",
    "                text = text.lower()\n",
    "            if self.replace_urls:\n",
    "                extractor = URLExtract()\n",
    "                urls = list(set(extractor.find_urls(text)))\n",
    "                urls.sort(key=lambda url: len(url), reverse=True)\n",
    "                for url in urls:  # 替换url 为 ‘URL’\n",
    "                    text = text.replace(url, \" URL \")\n",
    "            if self.replace_numbers:  # 替换数字\n",
    "                text = re.sub(r'\\d+(?:\\.\\d*(?:[eE]\\d+))?', 'NUMBER', text)\n",
    "            if self.remove_punctuation:  # 删除标点符号\n",
    "                text = re.sub(r'\\W+', ' ', text, flags=re.M)\n",
    "            word_counts = Counter(text.split())\n",
    "            if self.stemming and stemmer is not None:\n",
    "                stemmed_word_counts = Counter()\n",
    "                for word, count in word_counts.items():\n",
    "                    stemmed_word = stemmer.stem(word)\n",
    "                    stemmed_word_counts[stemmed_word] += count\n",
    "                word_counts = stemmed_word_counts\n",
    "            X_transformed.append(word_counts)\n",
    "        return np.array(X_transformed)\n",
    "    \n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([Counter({'chuck': 1, 'murcko': 1, 'wrote': 1, 'stuff': 1, 'yawn': 1, 'r': 1}),\n",
       "       Counter({'the': 11, 'of': 9, 'and': 8, 'all': 3, 'christian': 3, 'to': 3, 'by': 3, 'jefferson': 2, 'i': 2, 'have': 2, 'superstit': 2, 'one': 2, 'on': 2, 'been': 2, 'ha': 2, 'half': 2, 'rogueri': 2, 'teach': 2, 'jesu': 2, 'some': 1, 'interest': 1, 'quot': 1, 'url': 1, 'thoma': 1, 'examin': 1, 'known': 1, 'word': 1, 'do': 1, 'not': 1, 'find': 1, 'in': 1, 'our': 1, 'particular': 1, 'redeem': 1, 'featur': 1, 'they': 1, 'are': 1, 'alik': 1, 'found': 1, 'fabl': 1, 'mytholog': 1, 'million': 1, 'innoc': 1, 'men': 1, 'women': 1, 'children': 1, 'sinc': 1, 'introduct': 1, 'burnt': 1, 'tortur': 1, 'fine': 1, 'imprison': 1, 'what': 1, 'effect': 1, 'thi': 1, 'coercion': 1, 'make': 1, 'world': 1, 'fool': 1, 'other': 1, 'hypocrit': 1, 'support': 1, 'error': 1, 'over': 1, 'earth': 1, 'six': 1, 'histor': 1, 'american': 1, 'john': 1, 'e': 1, 'remsburg': 1, 'letter': 1, 'william': 1, 'short': 1, 'again': 1, 'becom': 1, 'most': 1, 'pervert': 1, 'system': 1, 'that': 1, 'ever': 1, 'shone': 1, 'man': 1, 'absurd': 1, 'untruth': 1, 'were': 1, 'perpetr': 1, 'upon': 1, 'a': 1, 'larg': 1, 'band': 1, 'dupe': 1, 'import': 1, 'led': 1, 'paul': 1, 'first': 1, 'great': 1, 'corrupt': 1}),\n",
       "       Counter({'url': 4, 's': 3, 'group': 3, 'to': 3, 'in': 2, 'forteana': 2, 'martin': 2, 'an': 2, 'and': 2, 'we': 2, 'is': 2, 'yahoo': 2, 'unsubscrib': 2, 'y': 1, 'adamson': 1, 'wrote': 1, 'for': 1, 'altern': 1, 'rather': 1, 'more': 1, 'factual': 1, 'base': 1, 'rundown': 1, 'on': 1, 'hamza': 1, 'career': 1, 'includ': 1, 'hi': 1, 'belief': 1, 'that': 1, 'all': 1, 'non': 1, 'muslim': 1, 'yemen': 1, 'should': 1, 'be': 1, 'murder': 1, 'outright': 1, 'know': 1, 'how': 1, 'unbias': 1, 'memri': 1, 'don': 1, 't': 1, 'html': 1, 'rob': 1, 'sponsor': 1, 'number': 1, 'dvd': 1, 'free': 1, 'p': 1, 'join': 1, 'now': 1, 'from': 1, 'thi': 1, 'send': 1, 'email': 1, 'egroup': 1, 'com': 1, 'your': 1, 'use': 1, 'of': 1, 'subject': 1})],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 在一些邮件上 测试 转换器\n",
    "X_few = X_train[:3]\n",
    "X_few_wordcounts = EmailToWordCounterTransformer().fit_transform(X_few)\n",
    "X_few_wordcounts"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 有了单词计数，我们需要把它们转换成向量。为此，我们将构建另一个转换器，其“fit（）”方法将构建词汇表（最常用单词的有序列表），其“transform（）”方法将使用词汇表将单词计数转换为向量--稀疏矩阵"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 稀疏矩阵，0数值比较多"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "from scipy.sparse import csr_matrix\n",
    "\n",
    "class WordCounterToVectorTransformer(BaseEstimator, TransformerMixin):\n",
    "    def __init__(self, vocabulary_size = 1000):\n",
    "        self.vocabulary_size = vocabulary_size  # 词汇量\n",
    "    def fit(self, X, y = None):\n",
    "        total_count = Counter()\n",
    "        for word_count in X:\n",
    "            for word, count in word_count.items():\n",
    "                # total_count 全部邮件单词\n",
    "                total_count[word] += min(count, 10)\n",
    "        most_common = total_count.most_common()[:self.vocabulary_size]\n",
    "        self.most_common_ = most_common\n",
    "        self.vocabulary_ = {word: index + 1 for index, (word, count) in enumerate(most_common)}\n",
    "        return self\n",
    "    def transform(self, X, y = None):\n",
    "        rows = []\n",
    "        cols = []\n",
    "        data = []\n",
    "        for row, word_count in enumerate(X):\n",
    "            for word, count in word_count.items():\n",
    "                rows.append(row) # 训练集 实例个数\n",
    "                cols.append(self.vocabulary_.get(word, 0)) # 取得单词在词汇表中的索引位置，0代表未出现在词汇表中\n",
    "                data.append(count)\n",
    "        return csr_matrix((data, (rows, cols)), shape=(len(X), self.vocabulary_size + 1)) # 输出稀疏矩阵 +1因为第一列要显示未出现在词汇表中的单词统计数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3, 11)"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vocab_transformer = WordCounterToVectorTransformer(vocabulary_size=10)\n",
    "X_few_vectors = vocab_transformer.fit_transform(X_few_wordcounts)\n",
    "X_few_vectors.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 6,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0],\n",
       "       [99, 11,  9,  8,  3,  1,  3,  1,  3,  2,  3],\n",
       "       [67,  0,  1,  2,  3,  4,  1,  2,  0,  1,  0]], dtype=int32)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_few_vectors.toarray()\n",
    "# 每一行代表邮件的一个特征，67表示有67个单词没有出现在常用单词列表中"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'the': 1,\n",
       " 'of': 2,\n",
       " 'and': 3,\n",
       " 'to': 4,\n",
       " 'url': 5,\n",
       " 'all': 6,\n",
       " 'in': 7,\n",
       " 'christian': 8,\n",
       " 'on': 9,\n",
       " 'by': 10}"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "vocab_transformer.vocabulary_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "preprocess_pipeline = Pipeline([\n",
    "    (\"email_to_wordcount\", EmailToWordCounterTransformer()),\n",
    "    (\"wordcount_to_vector\", WordCounterToVectorTransformer()),\n",
    "])\n",
    "\n",
    "X_train_transformed = preprocess_pipeline.fit_transform(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  ................................................................\n",
      "[CV] .................................. , score=0.98125, total=   0.0s\n",
      "[CV]  ................................................................\n",
      "[CV] .................................. , score=0.98375, total=   0.0s"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.0s remaining:    0.0s\n",
      "[Parallel(n_jobs=1)]: Done   2 out of   2 | elapsed:    0.1s remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "[CV]  ................................................................\n",
      "[CV] .................................. , score=0.99125, total=   0.1s\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   3 out of   3 | elapsed:    0.3s finished\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.9854166666666666"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 逻辑回归分类器\n",
    "\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "# 初始化逻辑回购的分类器  训练集\n",
    "log_clf = LogisticRegression(solver=\"liblinear\", random_state=42) # 采用逻辑回归分类器\n",
    "score = cross_val_score(log_clf, X_train_transformed, y_train, cv=3, verbose=3)\n",
    "score.mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "精度: 96.88%\n",
      "召回: 97.89%\n"
     ]
    }
   ],
   "source": [
    "# 逻辑回归\n",
    "from sklearn.metrics import precision_score, recall_score\n",
    "\n",
    "X_test_transformed = preprocess_pipeline.transform(X_test)\n",
    "\n",
    "log_clf = LogisticRegression(solver=\"liblinear\", random_state=42)\n",
    "log_clf.fit(X_train_transformed, y_train)\n",
    "\n",
    "y_pred = log_clf.predict(X_test_transformed)\n",
    "\n",
    "print(\"精度: {:.2f}%\".format(100 * precision_score(y_test, y_pred)))\n",
    "print(\"召回: {:.2f}%\".format(100 * recall_score(y_test, y_pred)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
